#!/bin/bash

# =====================================================
# 项目结构生成器 (Bash 版)
# 从 structure.txt 创建目录/文件结构
# 支持树形符号：├ ├── └ └── │ ─
# =====================================================

STRUCTURE_FILE="structure.txt"

# 颜色定义
RED='\033[31m'
GREEN='\033[32m'
BLUE='\033[34m'
YELLOW='\033[33m'
NC='\033[0m'

error() { echo -e "${RED}❌ 错误：$*${NC}" >&2; exit 1; }
info()  { echo -e "${BLUE}📁 $*${NC}"; }
file_info() { echo -e "${BLUE}📄 $*${NC}"; }
success() { echo -e "${GREEN}✅ $*${NC}"; }

# -------------------------------
# 检查文件是否存在
# -------------------------------
[[ -f "$STRUCTURE_FILE" ]] || error "找不到结构文件: $STRUCTURE_FILE"

# -------------------------------
# 读取有效行（非空、非纯注释）
# -------------------------------
mapfile -t lines < <(
    while IFS= read -r line; do
        # 去除行尾回车
        line="${line%$'\r'}"
        # 跳过空行或以 # 开头的纯注释行
        [[ -z "${line// }" || "$line" =~ ^[[:space:]]*# ]] && continue
        # 确保行中包含有效字符（字母/数字/斜杠）
        [[ "$line" =~ [a-zA-Z0-9/] ]] && echo "$line"
    done < "$STRUCTURE_FILE"
)

[[ ${#lines[@]} -gt 0 ]] || error "结构文件为空或无有效内容"

# -------------------------------
# 提取根目录名
# -------------------------------
first_line="${lines[0]}"
# 去除左侧树形符号和空白（支持：├ └ │ ─ 空格 tab）
root_name=$(echo "$first_line" | sed 's/^[├└│─[:space:]]\+//' | sed 's/#.*//' | sed 's/[[:space:]]\+/ /g' | xargs | sed 's:/*$::')

[[ -n "$root_name" ]] || error "无法解析根目录名"

root_dir="$root_name"
mkdir -p "$root_dir" || error "无法创建根目录: $root_dir"
info "创建根目录: $root_dir/"

# -------------------------------
# 路径栈（模拟递归）
# -------------------------------
path_stack=("$root_dir")

# -------------------------------
# 函数：清理行内容（去符号、注释、多余空格）
# -------------------------------
clean_content() {
    local line="$1"
    echo "$line" | sed 's/^[├└│─[:space:]]\+//' | sed 's/#.*//' | sed 's/[[:space:]]\+/ /g' | xargs
}

# -------------------------------
# 函数：计算缩进层级（每4空格 = 1级，Tab = 4空格）
# -------------------------------
get_indent_level() {
    local line="$1"
    # 保留原始缩进（含树形符号前缀）
    local prefix=$(echo "$line" | grep -o '^[^a-zA-Z0-9/]*')
    # 移除树形符号，只保留空白
    local whitespace=$(echo "$prefix" | sed 's/[├└│─]//g')
    # 替换 Tab 为 4 个空格
    local expanded=$(echo "$whitespace" | sed 's/\t/    /g')
    # 计算总空格数并除以 4
    local spaces=${#expanded}
    echo $((spaces / 4))
}

# -------------------------------
# 主循环：处理每一行
# -------------------------------
for ((i = 1; i < ${#lines[@]}; i++)); do
    line="${lines[i]}"
    
    content=$(clean_content "$line")
    [[ -z "$content" ]] && continue

    # 判断是否为目录（以 / 结尾）
    if [[ "$content" == */ ]]; then
        is_dir=1
        name="${content%/}"
    else
        is_dir=0
        name="$content"
    fi

    indent=$(get_indent_level "$line")

    # 调整路径栈到当前层级
    path_stack=("${path_stack[@]:0:indent+1}")
    parent="${path_stack[-1]}"
    current_path="$parent/$name"

    # 检查是否已存在
    if [[ -e "$current_path" ]]; then
        if [[ -d "$current_path" && $is_dir -eq 1 ]]; then
            info "目录已存在: $current_path/"
        elif [[ -f "$current_path" && $is_dir -eq 0 ]]; then
            file_info "文件已存在: $current_path"
        else
            error "路径类型冲突（期望${is_dir:+目录:文件}，实际$( [[ -d "$current_path" ]] && echo 目录 || echo 文件 )）: $current_path"
        fi
        # 若是目录，加入栈
        [[ $is_dir -eq 1 ]] && path_stack+=("$current_path")
        continue
    fi

    # 创建目录或文件
    if [[ $is_dir -eq 1 ]]; then
        mkdir -p "$current_path" || error "创建目录失败: $current_path"
        info "创建目录: $current_path/"
        path_stack+=("$current_path")
    else
        mkdir -p "$(dirname "$current_path")" || error "创建父目录失败: $(dirname "$current_path")"
        touch "$current_path" || error "创建文件失败: $current_path"
        file_info "创建文件: $current_path"
    fi
done

echo
success "项目结构已成功创建在: ./$root_dir/"
